#include <iostream>
#include <climits>
using namespace std;
struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution
{
    // 思路：中序遍历一个二叉搜索树，得到的结果是一个递增的有序序列。
    // 1. 定义一个变量pre_val，初始值为LONG_MIN，表示上一个访问的节点值。
    // 2. 递归遍历二叉树的左子树。
    // 3. 因为是二叉搜索树，中序遍历时当前节点值应该大于pre_val，如果不满足则返回false。
    // 4. 更新pre_val为当前节点值。
    // 5. 递归遍历二叉树的右子树。
    // 6. 如果所有节点都满足条件，则返回true。
public:
    bool isValidBST(TreeNode *root)
    {
        long long pre_val = LONG_MIN;
        return help(root, pre_val);
    }
    bool help(TreeNode *root, long long &pre_val)
    {
        if (!root)
            return true;
        if (!help(root->left, pre_val))
            return false;
        if (root->val <= pre_val)
            return false;
        pre_val = root->val;
        if (!help(root->right, pre_val))
            return false;
        return true;
    }
};